import axios, {AxiosRequestConfig} from 'axios';
import {ElMessage, ElMessageBox} from 'element-plus';
import {Session} from "@/utils/storage";
import {store} from '@/store';

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL,
});


// 请求拦截器
request.interceptors.request.use(
  function (config) {
    // 容错：防止请求地址中有空格
    config.url = config.url?.trim();
    // 设置token
    const {user} = store.state;
    if (user && user.token) {
      config.headers = config.headers || {};
      config.headers.Authorization = user.token;
    }
    return config;
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  function (response) {
    const status = response.data.status;
    // 请求成功
    if (!status || status === 200) {
      return response;
    }
    return response;

  },
  function (error) {
    if (error.response) {
      const errorMessage = error.response.data === null ? '系统内部异常，请联系网站管理员' : error.response.data.message
      switch (error.response.status) {
        case 404:
          ElMessage.error('很抱歉，资源未找到');
          break
        case 403:
          ElMessage.error('很抱歉，您暂无该操作权限');
          break
        case 401:
          ElMessageBox.alert('登录超时，请重新登录', '温馨提示', {
            confirmButtonText: '确定',
            showClose: false,
            callback: () => {
              Session.clear() // 清除浏览器全部临时缓存
              window.location.reload()
            }
          }).then(r => {
          })
          break
        default:
          ElMessage.error(errorMessage);
          break
      }
    }
    return Promise.reject(error);
  });
// request 不支持泛型
// request.get / post/ put 支持相应数据泛型
// 由于后端包装一层数据 data ，导致访问数据比较麻烦，所以封装了 request
export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then((res) => (res.data) as T);
};
